package com.dries.portal.module.coupon.vo;

import cn.hutool.core.util.StrUtil;
import com.dries.portal.module.coupon.enums.PeriodType;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.util.Date;

/**
 * @Description: 优惠券规则对象定义
 * @Author ZSY
 * @createTime 2020/7/27 10:45
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TemplateRule {

    /** 优惠券过期规则 */
    private Expiration expiration;
    /**
     * 折扣
     */
    private Discount discount;
    /**
     * 限制领取数量
     */
    private Integer limitation;
    /**
     * 使用范围： 地域 + 商品类型
     */
    private Usage usage;
    /**
     * 权重（可以和哪些优惠券叠加使用,同一类的优惠券一定不能叠加： list[]，优惠券的编码）
     */
    private String weight;

    /**
     * 有效期规则
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Expiration {
        /**
         * 有效期规则，对应PeriodType 的 code 字段
         */
        private Integer period;
        /**
         * 有效间隔： 只对变动性有效期有效
         */
        private Integer gap;
        /**
         * 优惠券模板的失效日期，两类规则都有效
         */
        private Date deadline;

        boolean validate() {
            // 最简化校验
            return PeriodType.of(period) != null && gap > 0 && deadline.before(new Date());
        }
    }

    /**
     * 折扣，需要与类型配合决定
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Discount {
        /**
         * 额度： 满减（20），折扣（85），立减（10）
         */
        private BigDecimal quota;
        /**
         * 基准，满多少才能用
         */
        private BigDecimal base;

        boolean validate() {
            // 最简化校验
            return quota.compareTo(BigDecimal.ZERO) > 0 && base.compareTo(BigDecimal.ZERO) > 0;
        }
    }

    /**
     * 使用范围
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Usage {
        /**
         * 省份
         */
        private String province;
        /**
         * 城市
         */
        private String city;
        /**
         * 商品类型，list[文娱，生鲜，家居，全品类]
         */
        private String goodsType;

        boolean validate() {
            return StrUtil.isNotEmpty(province)
                    && StrUtil.isNotEmpty(city)
                    && StrUtil.isNotEmpty(goodsType);
        }

    }

}
